package net.toocruel.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;


/**
 * HDFS操作 cloudera环境
 *
 * @author : 宋同煜
 * @version : 1.0
 * @createTime : 2017/4/12 14:27
 * @description :
 */
public class HDFSAPI {

    private FileSystem fileSystem = null;
    @Before
    public void init() throws Exception {
        //跟HDFS建立连接
        //方式一：
//        Configuration conf = new Configuration() ;
//        System.setProperty("HADOOP_USER_NAME","hdfs");
//        conf.set("fs.defaultFS","hdfs://cloudera:8020"); //9000 不使用cloudera 单独安装的hdfs端口是9000
//        fileSystem = FileSystem.get(conf);

        //方式二
        Configuration conf = new Configuration() ;
        fileSystem = FileSystem.get(new URI("hdfs://cloudera:8020"),conf,"hdfs");

        //

    }


    /**
     * 文件上传
     * @return
     */
    @Test
    public void testUpload()throws Exception{
        //打开本地文件作为输入流
        InputStream in = new FileInputStream("temp/a.txt");

        //使用HDFS的filesystem打开一个输出流
        FSDataOutputStream out = fileSystem.create(new Path("/sty/wordcount/input/a.txt"));

        //in -> out
        IOUtils.copyBytes(in,out,1024,true);

        //关闭fileSystem连接
        fileSystem.close();
    }

    /**
     * 创建目录
     * @throws IOException
     */
    @Test
    public void testMkdir() throws IOException {
        fileSystem.mkdirs(new Path("/sty/wordcount/output"));

        //关闭fileSystem连接
        fileSystem.close();
    }

    /**
     * 删除文件或目录
     * @throws IOException
     */
    @Test
    public void testDel() throws IOException {
        boolean success = fileSystem.delete(new Path("/sty/wordcount/output"),true);//true ： 如果是目录，递归删除
        System.out.println(success);
        //关闭fileSystem连接
        fileSystem.close();
    }

    /**
     * 其他
     * @throws IOException
     */
    @Test
    public void testOther() throws IOException {

        //文件是否存在
        boolean exists = fileSystem.exists(new Path("/a.txt"));
        System.out.println(exists);

        // ......
        //关闭fileSystem连接
        fileSystem.close();
    }

}
